home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2009 February
/
PCWFEB09.iso
/
Software
/
Linux
/
Kubuntu 8.10
/
kubuntu-8.10-desktop-i386.iso
/
casper
/
filesystem.squashfs
/
usr
/
sbin
/
cleanup-info
< prev
next >
Wrap
Text File
|
2008-09-03
|
5KB
|
181 lines
#!/usr/bin/perl --
#
# Clean up the mess that bogus install-info may have done :
#
# - gather all sections with the same heading into a single one.
# Tries to be smart about cases and trailing colon/spaces.
#
# Other clean ups :
#
# - remove empty sections,
# - squeeze blank lines (in entries part only).
#
# Order of sections is preserved (the first encountered section
# counts).
#
# Order of entries within a section is preserved.
#
# BUGS:
#
# Probably many : I just recently learned Perl for this program
# using the man pages. Hopefully this is a short enough program to
# debug.
use strict;
use warnings;
use Dpkg;
use Dpkg::Gettext;
textdomain("dpkg");
($0) = $0 =~ m:.*/(.+):;
sub version {
printf _g("Debian %s version %s.\n"), $0, $version;
printf _g("
Copyright (C) 1996 Kim-Minh Kaplan.");
printf _g("
This is free software; see the GNU General Public Licence version 2 or
later for copying conditions. There is NO warranty.
");
}
sub usage {
printf _g(
"Usage: %s [<option> ...] [--] [<dirname>]
Options:
--unsafe set some additional possibly useful options.
warning: this option may garble an otherwise correct file.
--help show this help message.
--version show the version.
"), $0;
}
my $infodir = '/usr/info';
my $unsafe = 0;
$0 =~ m|[^/]+$|;
my $name= $&;
sub ulquit {
unlink "$infodir/dir.lock"
or warn sprintf(_g("%s: warning - unable to unlock %s: %s"),
$name, "$infodir/dir", $!)."\n";
die "$name: $_[0]";
}
while (scalar @ARGV > 0 && $ARGV[0] =~ /^--/) {
$_ = shift;
/^--$/ and last;
/^--version$/ and do {
version;
exit 0;
};
/^--help$/ and do {
usage;
exit 0;
};
/^--unsafe$/ and do {
$unsafe=1;
next;
};
printf STDERR _g("%s: unknown option \`%s'")."\n", $name, $_;
usage;
exit 1;
}
if (scalar @ARGV > 0) {
$infodir = shift;
if (scalar @ARGV > 0) {
printf STDERR _g("%s: too many arguments")."\n", $name;
usage;
exit 1;
}
}
if (!link "$infodir/dir", "$infodir/dir.lock") {
die sprintf(_g("%s: failed to lock dir for editing! %s"),
$name, $!)."\n".
($! =~ /exist/i ? sprintf(_g("try deleting %s"),
"$infodir/dir.lock")."\n" : '');
}
open OLD, "$infodir/dir"
or ulquit sprintf(_g("unable to open %s: %s"), "$infodir/dir", $!)."\n";
open OUT, ">$infodir/dir.new"
or ulquit sprintf(_g("unable to create %s: %s"), "$infodir/dir.new", $!)."\n";
my (%sections, @section_list, $lastline);
my $section="Miscellaneous"; # default section
my $section_canonic="miscellaneous";
my $waitfor = $unsafe ? '^\*.*:' : '^\*\s*Menu';
while (<OLD>) { # dump the non entries part
last if (/$waitfor/oi);
if (defined $lastline) {
print OUT $lastline
or ulquit sprintf(_g("unable to write %s: %s"),
"$infodir/dir.new", $!)."\n";
}
$lastline = $_;
};
if (/^\*\s*Menu\s*:?/i) {
print OUT $lastline if defined $lastline;
print OUT $_;
} else {
print OUT "* Menu:\n";
if (defined $lastline) {
$lastline =~ s/\s*$//;
if ($lastline =~ /^([^\*\s].*)/) { # there was a section title
$section = $1;
$lastline =~ s/\s*:$//;
$section_canonic = lc $lastline;
}
}
push @section_list, $section_canonic;
s/\s*$//;
$sections{$section_canonic} = "\n$section\n$_\n";
}
foreach (<OLD>) { # collect sections
next if (/^\s*$/ or $unsafe and /^\*\s*Menu/oi);
s/\s*$//;
if (/^([^\*\s].*)/) { # change of section
$section = $1;
s/\s*:$//;
$section_canonic = lc $_;
} else { # add to section
if (! exists $sections{$section_canonic}) { # create section header
push @section_list, $section_canonic;
$sections{$section_canonic} = "\n$section\n";
}
$sections{$section_canonic} .= "$_\n";
}
}
eof OLD or ulquit sprintf(_g("unable to read %s: %s"), "$infodir/dir", $!)."\n";
close OLD or ulquit sprintf(_g("unable to close %s after read: %s"),
"$infodir/dir", $!)."\n";
print OUT @sections{@section_list};
close OUT or ulquit sprintf(_g("unable to close %s: %s"),
"$infodir/dir.new", $!)."\n";
# install clean version
unlink "$infodir/dir.old";
link "$infodir/dir", "$infodir/dir.old"
or ulquit sprintf(_g("unable to backup old %s, giving up: %s"),
"$infodir/dir", $!)."\n";
rename "$infodir/dir.new", "$infodir/dir"
or ulquit sprintf(_g("failed to install %s; it will be left as %s: %s"),
"$infodir/dir", "$infodir/dir.new", $!)."\n";
unlink "$infodir/dir.lock"
or die sprintf(_g("%s: unable to unlock %s: %s"),
$name, "$infodir/dir", $!)."\n";
exit 0;